package com.hyg.module_report.adapter;

import android.content.Context;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Shader;
import android.graphics.drawable.GradientDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.AxisBase;
import com.github.mikephil.charting.components.Description;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
import com.github.mikephil.charting.formatter.ValueFormatter;
import com.hyg.lib_base.mainUtils.NumberFormatUtil;
import com.hyg.module_report.R;
import com.hyg.module_report.model.PulseDatas;

import java.util.ArrayList;


/*   脉诊的适配器   */
@SuppressWarnings("ALL")
public class PulseDataAdapter extends RecyclerView.Adapter<PulseDataAdapter.ViewHolder> {
    private Context context;
    private ArrayList<PulseDatas> dataList;
    private ReportListAdapter.OnItemClickLitener mOnItemClickLitener;

    public PulseDataAdapter(Context activity, ArrayList<PulseDatas> dataList) {
        this.context = activity.getApplicationContext();
        this.dataList = dataList;
    }

    public void addItem(PulseDatas content, int position) {
        dataList.add(position, content);
        notifyItemInserted(position); //Attention!
    }

    public void removeItem(PulseDatas model) {
        int position = dataList.indexOf(model);
        dataList.remove(position);
        notifyItemRemoved(position);//Attention!
    }


    public interface OnItemClickLitener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    public void setOnItemClickLitener(ReportListAdapter.OnItemClickLitener mOnItemClickLitener) {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_pulsedata, parent, false);
        ViewHolder holder = new ViewHolder(view);

        return holder;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, int position) {
        ViewHolder viewHolder = (ViewHolder) holder;
        viewHolder.bindView(dataList.get(position)
                , position);
    }


    public void removeData(int position) {
        dataList.remove(position);
        notifyItemRemoved(position);
    }

    //    public long getItemId(int position) {
    //        return position;
    //    }

    @Override
    public int getItemCount() {
        if (dataList == null) {
            return 0;
        }
        return dataList.size();
    }

    class ViewHolder extends RecyclerView.ViewHolder {
//        private String pulseHand = "";                          // 左手
//        private String pulsePos = "";                           //寸位
//        private String pulsePressureType = "";                  //中取
//        private ArrayList<Entry> data0 = new ArrayList<Entry>();    //数据图像1
//        private ArrayList<Entry> data1 = new ArrayList<Entry>();    //
//        private ArrayList<Entry> data2 = new ArrayList<Entry>();    //
//        private String fluency = "";                            //流利
//        private String tensionDegree = "";                      //弛缓
//        private String pulseForce = "";                         //有力
//        private String pulseRate = "";                          //脉速率
//        private String pulseType = "";                          //浮脉
//        private String diagnosisDate = "";                      //诊断日期
//        private String pfu = "";                                //节律均匀度
//        private String sru = "";                                //脉力均匀度
//        private String createTime = "";                         //创建时间
//        private String updateTime = "";                         //更新时间

        private TextView maiquweizhi, pulseForce, fluency, tensionDegree, pulseRate, pulseType, pfu, sru, pulse_number;
        private LineChart pulse_optimum_chart;
        private LineChart pulse_continuity_chart;
        private ArrayList<Entry> continuity_chart = new ArrayList<Entry>();
        private int limit = 0;

        public ViewHolder(View itemView) {
            super(itemView);
            maiquweizhi = (TextView) itemView.findViewById(R.id.maiquweizhi);
            pulseForce = (TextView) itemView.findViewById(R.id.maili);
            fluency = (TextView) itemView.findViewById(R.id.liulidu);
            tensionDegree = (TextView) itemView.findViewById(R.id.jinzhangdu);
            pulseRate = (TextView) itemView.findViewById(R.id.mailv);
//            pulseType = (TextView) itemView.findViewById(R.id.maixing);
            pfu = (TextView) itemView.findViewById(R.id.jielvjunyundu);
            sru = (TextView) itemView.findViewById(R.id.mailijunyundu);
            pulse_number = (TextView) itemView.findViewById(R.id.pulse_number);

            pulse_optimum_chart = (LineChart) itemView.findViewById(R.id.pulse_optimum_chart);
            pulse_continuity_chart = (LineChart) itemView.findViewById(R.id.pulse_continuity_chart);

        }

        public void bindView(final PulseDatas data, final int pos) {

            maiquweizhi.setText(data.getPulseHand() + "手\n" + data.getPulsePos() + "位\n" + data.getPulsePressureType());
            pulseForce.setText(data.getPulseForce());
            fluency.setText(data.getFluency());
            tensionDegree.setText(data.getTensionDegree());

            int idx = data.getPulseRate().lastIndexOf(".");//查找小数点的位置
            String strNum = data.getPulseRate().substring(0, idx);//截取从字符串开始到小数点位置的字符串，就是整数部分
            pulseRate.setText(strNum);//+"次/分"
            pfu.setText(data.getPfu());
            sru.setText(data.getSru());
            pulse_number.setText("脉象图采集 (" + NumberFormatUtil.formatInteger(pos + 1) + ")");

            limit = Integer.parseInt(data.getEndIndex()) - Integer.parseInt(data.getStartIndex());
//            //创建RxAndroid线程
//            Observable.create(new ObservableOnSubscribe<byte[]>() {
//                @Override
//                public void subscribe(final ObservableEmitter<byte[]> subscriber) throws Exception {
//                    Log.d("pulse", "subscribe");
            pulse_continuity_chart.setDrawGridBackground(false);
            Description description = new Description();
            description.setText("");
            pulse_continuity_chart.setDescription(description);//添加图线描述

            pulse_continuity_chart.setTouchEnabled(true);//默认可触摸
            pulse_continuity_chart.setDragEnabled(true);// 是否可以拖拽
            pulse_continuity_chart.setScaleEnabled(false);// 是否可以缩放 x和y轴, 默认是true
            pulse_continuity_chart.setScaleXEnabled(false); //是否可以缩放 仅x轴
            pulse_continuity_chart.setScaleYEnabled(false); //是否可以缩放 仅y轴
            pulse_continuity_chart.setPinchZoom(false); //设置x轴和y轴能否同时缩放。默认是否
            pulse_continuity_chart.setDoubleTapToZoomEnabled(false);//设置是否可以通过双击屏幕放大图表。默认是true
            pulse_continuity_chart.setHighlightPerDragEnabled(false);//能否拖拽高亮线(数据点与坐标的提示线)，默认是true
            pulse_continuity_chart.setDragDecelerationEnabled(true);//拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）
            pulse_continuity_chart.setDragDecelerationFrictionCoef(0.99f);//与上面那个属性配合，持续滚动时的速度快慢，[0,1) 0代表立即停止。
            pulse_continuity_chart.zoomToCenter(1.4f, 1f);

            XAxis xAxis = pulse_continuity_chart.getXAxis();//获取x轴
            //xAxis.setDrawAxisLine(true);//绘制X轴，默认为true
            xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);//设置x轴位置，有四个属性。可以说是上下两个位置，只不过轴标签分为轴线内外，感兴趣的可以自己试试
            //禁用x轴，设置为false后该轴任何部分都不会绘制,所以即使再设置xAxis.setDrawAxisLine(true);也不会被绘制
            //xAxis.setEnabled(false);
            xAxis.setDrawGridLines(false);//绘制网格线，默认为true
            xAxis.setDrawAxisLine(false);//则绘制该行旁边的轴线（axis-line）
            xAxis.setGridColor(Color.parseColor("#000000"));//设置该轴的网格线颜色。
            xAxis.setGridLineWidth(0.4f);// 设置该轴网格线的宽度。
            xAxis.setDrawLabels(false);//绘制该轴标签
            xAxis.setTextColor(Color.RED);// 设置轴标签的颜色。
            xAxis.setTextSize(11f);//设置轴标签的文字大小。
            xAxis.setAxisLineColor(Color.parseColor("#000000"));
            xAxis.setAxisLineWidth(0.4f);
            xAxis.setValueFormatter(
//                            new IAxisValueFormatter() {
//                        @Override
//                        public String getFormattedValue(float value, AxisBase axis) {
//                            int i = (int) value;
//                            return "数据" + i;
//                        }
//                    }
                    new ValueFormatter() {
                        @Override
                        public String getFormattedValue(float value, AxisBase axis) {
                            int i = (int) value;
                            return "数据" + i;
                        }
                    }
            );

            if (data.getPulsePressureType().contains("沉")) {
                continuity_chart.addAll(data.getData2());
            } else if (data.getPulsePressureType().contains("中")) {
                continuity_chart.addAll(data.getData1());
            } else {
                continuity_chart.addAll(data.getData0());
            }

            LineDataSet dataSet = new LineDataSet(continuity_chart, "连续脉图");
            dataSet.setAxisDependency(YAxis.AxisDependency.LEFT);
            dataSet.setHighLightColor(Color.RED); // 设置点击某个点时，横竖两条线的颜色
            dataSet.setDrawValues(false);//在点上显示数值 默认true
            dataSet.setCircleRadius(1f);
            dataSet.setCircleColor(context.getResources().getColor(R.color.transparent));// 圆形的颜色
            dataSet.setHighLightColor(context.getResources().getColor(R.color.transparent)); // 高亮的线的颜色
            dataSet.setColor(context.getResources().getColor(R.color.view1_top_bg));
            dataSet.setLineWidth(1.5f); // 线宽
            dataSet.setCubicIntensity(15f);//曲线的平滑度，值越大越平滑。
            dataSet.setDrawFilled(true);   //设置 线下区域颜色填充 为空
            GradientDrawable aDrawable = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                    new int[]{Color.parseColor("#E6F4FF"), Color.parseColor("#ffffff")});
            dataSet.setFillDrawable(aDrawable);
            //            dataSet.setColor(context.getResources().getColor(R.color.gradient_blue));// 显示颜色
            dataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);//立方化，俗称圆润化
            //        dataSet.setValueTextSize(12f);//数值字体大小，同样可以设置字体颜色、自定义字体等
            LineData lineData = new LineData(dataSet);
            pulse_continuity_chart.setData(lineData);
            YAxis leftAxis = pulse_continuity_chart.getAxisLeft();//获取左轴
            pulse_continuity_chart.getAxisRight().setEnabled(false);//隐藏右轴  默认显示
            pulse_continuity_chart.getAxisLeft().setEnabled(true);//隐藏右轴  默认显示
            leftAxis.setDrawLabels(false);//设置是否显示Y轴的值
            leftAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
            leftAxis.setDrawGridLines(true);//设置所有垂直Y轴的的网格线是否显示
            leftAxis.enableGridDashedLine(15f, 15f, 0f);//设置虚线
            leftAxis.setDrawZeroLine(false);
            //            leftAxis.setDrawAxisLine(false);
            leftAxis.setGridColor(Color.parseColor("#dddddd"));//设置该轴的网格线颜色。
            leftAxis.setGridLineWidth(1f);// 设置该轴网格线的宽度。
            //设置Y轴最大最小值，不设置chart会自己计算
            //            leftAxis.setAxisMinimum(5000f);//设置最小值
            //            leftAxis.setAxisMaximum(25000f);//设置最大值
            pulse_continuity_chart.setMinOffset(5);//设置填充属性,类似与padding的效果
//                    pulse_continuity_chart.animateXY(1000,0);//默认动画
            Legend l = pulse_continuity_chart.getLegend();
            l.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
            //            l.setVerticalAlignment(Legend.LegendVerticalAlignment.CENTER);
            l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
            l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            l.setWordWrapEnabled(true);
            l.setDrawInside(false);
            l.setTextSize(16f);
            l.setXEntrySpace(0f);
            l.setYEntrySpace(7f);
            l.setYOffset(0f);
            l.setEnabled(false);
            // 输入标签样式 文本文字大小颜色
//                    subscriber.onComplete();
//                }
//            }).subscribeOn(Schedulers.io())//指定数据发射(上方的subscribe方法)在哪个线程执行
//                    .observeOn(AndroidSchedulers.mainThread())//observeOn方法决定他下面的方法执行在哪个线程中
//                    .subscribe(new Observer<byte[]>() {
//                        @Override
//                        public void onError(Throwable e) {
//                        }
//                        @Override
//                        public void onComplete() {

            pulse_continuity_chart.invalidate();
//                        }
//                        @Override
//                        public void onSubscribe(Disposable d) {
//                        }
//                        @Override
//                        public void onNext(byte[] res) {
//                        }
//                    });


            /*开启线程操作，导致部分手机一直延迟，显示不出来*/
//            //创建RxAndroid线程
//            Observable.create(new ObservableOnSubscribe<byte[]>() {
//                @Override
//                public void subscribe(final ObservableEmitter<byte[]> subscriber) throws Exception {
//                    Log.d("pulse", "subscribe");
            pulse_optimum_chart.setDrawGridBackground(false);
//                    Description description = new Description();
//                    description.setText("");
            pulse_optimum_chart.setDescription(description);//添加图线描述

            pulse_optimum_chart.setTouchEnabled(false);//默认可触摸
            pulse_optimum_chart.setDragEnabled(false);// 是否可以拖拽
            pulse_optimum_chart.setScaleEnabled(false);// 是否可以缩放 x和y轴, 默认是true
            pulse_optimum_chart.setScaleXEnabled(false); //是否可以缩放 仅x轴
            pulse_optimum_chart.setScaleYEnabled(false); //是否可以缩放 仅y轴
            pulse_optimum_chart.setPinchZoom(false); //设置x轴和y轴能否同时缩放。默认是否
            pulse_optimum_chart.setDoubleTapToZoomEnabled(false);//设置是否可以通过双击屏幕放大图表。默认是true
            pulse_optimum_chart.setHighlightPerDragEnabled(false);//能否拖拽高亮线(数据点与坐标的提示线)，默认是true
            pulse_optimum_chart.setDragDecelerationEnabled(true);//拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）
            pulse_optimum_chart.setDragDecelerationFrictionCoef(0.99f);//与上面那个属性配合，持续滚动时的速度快慢，[0,1) 0代表立即停止。

            XAxis xAxiss = pulse_optimum_chart.getXAxis();//获取x轴
            //xAxis.setDrawAxisLine(true);//绘制X轴，默认为true
            xAxiss.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE);//设置x轴位置，有四个属性。可以说是上下两个位置，只不过轴标签分为轴线内外，感兴趣的可以自己试试
            //禁用x轴，设置为false后该轴任何部分都不会绘制,所以即使再设置xAxis.setDrawAxisLine(true);也不会被绘制
            //            xAxiss.setEnabled(false);
            xAxiss.setDrawGridLines(false);//绘制网格线，默认为true
            xAxiss.setDrawAxisLine(false);//则绘制该行旁边的轴线（axis-line）
            xAxiss.setGridColor(Color.GRAY);//设置该轴的网格线颜色。
            xAxiss.setGridLineWidth(1f);// 设置该轴网格线的宽度。
            xAxiss.setDrawLabels(false);//绘制该轴标签
            xAxiss.setTextColor(Color.RED);// 设置轴标签的颜色。
            xAxiss.setTextSize(11f);//设置轴标签的文字大小。
            xAxiss.setValueFormatter(
//                    new IAxisValueFormatter() {
//                @Override
//                public String getFormattedValue(float value, AxisBase axis) {
//                    int i = (int) value;
//                    return "数据" + i;
//                }
//            }
                    new ValueFormatter() {
                        @Override
                        public String getFormattedValue(float value, AxisBase axis) {
                            int i = (int) value;
                            return "数据" + i;
                        }
                    }
            );
            ArrayList<Entry> spoitList = new ArrayList<Entry>();
            if (Integer.parseInt(data.getStartIndex()) > 1 && Integer.parseInt(data.getEndIndex()) > 1 && Integer.parseInt(data.getStartIndex()) < Integer.parseInt(data.getEndIndex())) {
                for (int i = Integer.parseInt(data.getStartIndex()); i < Integer.parseInt(data.getEndIndex()); i++) {
                    spoitList.add(new Entry(i, continuity_chart.get(i).getY()));
                }
            } else {
                spoitList.add(new Entry(0, 0));
            }

            LineDataSet dataSets = new LineDataSet(spoitList, "最佳脉图");
            dataSets.setAxisDependency(YAxis.AxisDependency.LEFT);
            dataSets.setDrawValues(false);//在点上显示数值 默认true
            dataSets.setCircleRadius(1f);
            dataSets.setCircleColor(context.getResources().getColor(R.color.transparent));// 圆形的颜色
            dataSets.setHighLightColor(context.getResources().getColor(R.color.gradient_Violet)); // 高亮的线的颜色// 设置点击某个点时，横竖两条线的颜色
            dataSets.setDrawFilled(true);
            dataSets.setCubicIntensity(10f);//曲线的平滑度，值越大越平滑。
            GradientDrawable aDrawables = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM,
                    new int[]{Color.parseColor("#E6F4FF"), Color.parseColor("#ffffff")});
            dataSets.setFillDrawable(aDrawables);    //
            dataSets.setColor(context.getResources().getColor(R.color.gradient_Violet));// 显示颜色
            dataSets.setLineWidth(1.75f); // 线宽
            dataSets.setMode(LineDataSet.Mode.CUBIC_BEZIER);//立方化，俗称圆润化
            //        dataSet.setValueTextSize(12f);//数值字体大小，同样可以设置字体颜色、自定义字体等
            LineData datas = new LineData(dataSets);

            pulse_optimum_chart.setData(datas);
            YAxis leftAxiss = pulse_optimum_chart.getAxisLeft();//获取左轴
            pulse_optimum_chart.getAxisRight().setEnabled(false);//隐藏右轴  默认显示
            pulse_optimum_chart.getAxisLeft().setEnabled(false);//隐藏右轴  默认显示
            leftAxiss.setDrawGridLines(false);//绘制网格线 默认为true
            leftAxiss.setGridColor(Color.GRAY);//设置该轴的网格线颜色。
            leftAxiss.setGridLineWidth(1f);// 设置该轴网格线的宽度。
            //设置Y轴最大最小值，不设置chart会自己计算
            //            leftAxiss.setAxisMinimum(0f);//设置最小值
            //            leftAxiss.setAxisMaximum(100f);//设置最大值
            //默认动画
//                    pulse_optimum_chart.animateXY(1000,0);
            pulse_optimum_chart.setMinOffset(1);//设置填充属性,类似与padding的效果
            Legend lg = pulse_optimum_chart.getLegend();
            lg.setVerticalAlignment(Legend.LegendVerticalAlignment.TOP);
            //            l.setVerticalAlignment(Legend.LegendVerticalAlignment.CENTER);
            lg.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
            lg.setOrientation(Legend.LegendOrientation.HORIZONTAL);
            lg.setWordWrapEnabled(true);
            lg.setDrawInside(false);
            lg.setTextSize(18f);
            lg.setXEntrySpace(0f);
            lg.setYEntrySpace(7f);
            lg.setYOffset(0f);
            //            lg.setEnabled(false);
            // 输入标签样式 文本文字大小颜色
//                    subscriber.onComplete();
//                }
//            }).subscribeOn(Schedulers.io())//指定数据发射(上方的subscribe方法)在哪个线程执行
//                    .observeOn(AndroidSchedulers.mainThread())//observeOn方法决定他下面的方法执行在哪个线程中
//                    .subscribe(new Observer<byte[]>() {
//                        @Override
//                        public void onError(Throwable e) {
//                        }
//                        @Override
//                        public void onComplete() {
            pulse_optimum_chart.invalidate();
//                        }
//                        @Override
//                        public void onSubscribe(Disposable d) {
//                        }
//                        @Override
//                        public void onNext(byte[] res) {
//
//                        }
//                    });

            // 如果设置了回调，则设置点击事件
            if (mOnItemClickLitener != null) {
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int pos = getLayoutPosition();
                        mOnItemClickLitener.onItemClick(itemView, pos);
                        //                    Toast.makeText(context,""+pos,Toast.LENGTH_SHORT).show();
                    }
                });

                itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        int pos = getLayoutPosition();
                        mOnItemClickLitener.onItemLongClick(itemView, pos);

                        return false;
                    }
                });
            }
        }
    }

    private int[] preparePrimitiveColors(LineDataSet dataSet) {
        int[] colors = new int[dataSet.getColors().size()];
        int i = 0;
        for (int color : dataSet.getColors()) {
            colors[i] = color;
            i++;
        }
        return colors;
    }

    public void setGradientColor(LineDataSet dataSet) {
        Paint regionColorPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        LinearGradient backGradient2 = new LinearGradient(0, 0, 1, 0,
                new int[]{ContextCompat.getColor(context, R.color.gradient_Violet),
                        ContextCompat.getColor(context, R.color.gradient_blue)}, new float[]{0, 0.7f}, Shader.TileMode.CLAMP);
        regionColorPaint.setStyle(Paint.Style.FILL);
        regionColorPaint.setAlpha(255);
        regionColorPaint.setAntiAlias(true);
        regionColorPaint.setShader(backGradient2);

    }

}
